using System;
using System.Collections.Generic;
using Csla;
using ENT.PM.Datos.MysqlHelper;
using System.Data;

namespace ENT.PM.Core.Proyecto
{
    [Serializable]
    public class Documentos :
      BusinessListBase<Documentos, Documento>
    {
        #region Factory Methods

        internal static Documentos NewDocuementos()
        {
            return DataPortal.CreateChild<Documentos>();
        }
        /// <summary>
        /// Obtiene los documentos relacionados
        /// </summary>
        /// <param name="Id">Id</param>
        /// <param name="Tipo">1: 2: 3: 4: Documentos de Estado Legal 5: Documentos de supervision</param>
        /// <returns></returns>
        internal static Documentos GetDocuementos(int Id,int Tipo,int supervision)
        {
            ProyectoCriterio criterio = ProyectoCriterio.NewProyectoCriterio();
            criterio.TipoId = Tipo;
            criterio.ProgramaId = Id;
            criterio.SupervisionId = supervision;
            return DataPortal.FetchChild<Documentos>(criterio);
        }

        private Documentos()
        { }

        #endregion

        #region Data Access

        private void Child_Fetch(ProyectoCriterio criterio)
        {
            RaiseListChangedEvents = false;

            HelperMySql objhm = HelperMySql.ObtenerConexion("");
            MySql.Data.MySqlClient.MySqlParameter[] parametros = new MySql.Data.MySqlClient.MySqlParameter[3];
            parametros[0] = new MySql.Data.MySqlClient.MySqlParameter("IDP", criterio.ProgramaId);
            parametros[1] = new MySql.Data.MySqlClient.MySqlParameter("T", criterio.TipoId);
            parametros[2] = new MySql.Data.MySqlClient.MySqlParameter("IDS", criterio.SupervisionId);
            foreach (DataRow items in objhm.EjecutarStoreProcedure(parametros, "Obtener_Lista_Documentos").Tables[0].Rows)
            {
                this.Add(Documento.GetDocumento(items));
            }

            RaiseListChangedEvents = true;
        }

        #endregion
    }


    [Serializable]
    public class Documento : BusinessBase<Documento>
    {
        #region Business Methods

        private static PropertyInfo<int> IdProperty = RegisterProperty<int>(o => o.Id, "Name");
        public int Id
        {
            get { return GetProperty(IdProperty); }
            set { SetProperty(IdProperty, value); }
        }

        private static PropertyInfo<int> IdProyectoProperty = RegisterProperty<int>(o => o.IdProyecto, "Name");
        public int IdProyecto
        {
            get { return GetProperty(IdProyectoProperty); }
            set { SetProperty(IdProyectoProperty, value); }
        }

        private static PropertyInfo<string> NombreArchivoProperty = RegisterProperty<string>(o => o.NombreArchivo, "Name");
        public string NombreArchivo
        {
            get { return GetProperty(NombreArchivoProperty); }
            set { SetProperty(NombreArchivoProperty, value); }
        }

        private static PropertyInfo<double> TamanoArchivoProperty = RegisterProperty<double>(o => o.TamanoArchivo, "Name");
        public double TamanoArchivo
        {
            get { return GetProperty(TamanoArchivoProperty); }
            set { SetProperty(TamanoArchivoProperty, value); }
        }

        private static PropertyInfo<string> RutaArchivoProperty = RegisterProperty<string>(o => o.RutaArchivo, "Name");
        public string RutaArchivo
        {
            get { return GetProperty(RutaArchivoProperty); }
            set { SetProperty(RutaArchivoProperty, value); }
        }

        private static PropertyInfo<string> TipoArchivoProperty = RegisterProperty<string>(o => o.TipoArchivo, "Name");
        public string TipoArchivo
        {
            get { return GetProperty(TipoArchivoProperty); }
            set { SetProperty(TipoArchivoProperty, value); }
        }

        private static PropertyInfo<string> TipoDocumentoProperty = RegisterProperty<string>(o => o.TipoDocumento, "Name");
        public string TipoDocumento
        {
            get { return GetProperty(TipoDocumentoProperty); }
            set { SetProperty(TipoDocumentoProperty, value); }
        }

        private static PropertyInfo<int> TipoProperty = RegisterProperty<int>(o => o.Tipo, "Name");
        public int Tipo
        {
            get { return GetProperty(TipoProperty); }
            set { SetProperty(TipoProperty, value); }
        }

        #endregion

        #region Validation Rules

        protected override void AddBusinessRules()
        {
            // TODO: add validation rules
            //ValidationRules.AddRule(RuleMethod, "");
        }

        #endregion

        #region Authorization Rules

        protected override void AddAuthorizationRules()
        {
            // TODO: add authorization rules
            //AuthorizationRules.AllowWrite("Name", "Role");
        }

        private static void AddObjectAuthorizationRules()
        {
            // TODO: add authorization rules
            //AuthorizationRules.AllowEdit(typeof(Documento), "Role");
        }

        #endregion

        #region Factory Methods

        internal static Documento NewDocumento()
        {
            return DataPortal.CreateChild<Documento>();
        }

        internal static Documento GetDocumento(DataRow childData)
        {
            return DataPortal.FetchChild<Documento>(childData);
        }

        public Documento()
        { /* Require use of factory methods */ }

        #endregion

        #region Data Access

        protected override void Child_Create()
        {
            // TODO: load default values
            // omit this override if you have no defaults to set
            base.Child_Create();
        }

        private void Child_Fetch(DataRow childData)
        {
            LoadProperty(IdProperty, Convert.ToInt32(childData[0].ToString()));
            LoadProperty(IdProyectoProperty, Convert.ToInt32(childData[1].ToString()));
            LoadProperty(TipoDocumentoProperty, childData[2].ToString());
            LoadProperty(TipoArchivoProperty, childData[3].ToString());
            LoadProperty(NombreArchivoProperty, childData[4].ToString());
            LoadProperty(TamanoArchivoProperty, Math.Round(Convert.ToDouble(childData[5].ToString()) / 1024, 2));
            LoadProperty(TipoProperty, Convert.ToInt32(childData[6].ToString()));
            //LoadProperty(RutaArchivoProperty, childData[7].ToString());
        }

        private void Child_Insert(int idPadre)
        {
            HelperMySql objhm = HelperMySql.ObtenerConexion("");
            MySql.Data.MySqlClient.MySqlParameter[] parametros = new MySql.Data.MySqlClient.MySqlParameter[7];
            try
            {
                parametros[0] = new MySql.Data.MySqlClient.MySqlParameter("IDP", idPadre);
                parametros[1] = new MySql.Data.MySqlClient.MySqlParameter("TIPOD", TipoDocumento);
                parametros[2] = new MySql.Data.MySqlClient.MySqlParameter("TIPOA", TipoArchivo);
                parametros[3] = new MySql.Data.MySqlClient.MySqlParameter("N", NombreArchivo);
                parametros[4] = new MySql.Data.MySqlClient.MySqlParameter("TAMA", TamanoArchivo);
                parametros[5] = new MySql.Data.MySqlClient.MySqlParameter("T", Tipo);
                parametros[6] = new MySql.Data.MySqlClient.MySqlParameter("IDS", 0);

                objhm.EjecutarStoreProcedure("Insertar_Proyecto_Documento", parametros);

            }
            catch (Exception)
            {

                throw;
            }
        }
        private void Child_Insert(int idPadre,int idSupervision)
        {
            HelperMySql objhm = HelperMySql.ObtenerConexion("");
            MySql.Data.MySqlClient.MySqlParameter[] parametros = new MySql.Data.MySqlClient.MySqlParameter[7];
            try
            {
                parametros[0] = new MySql.Data.MySqlClient.MySqlParameter("IDP", idPadre);
                parametros[1] = new MySql.Data.MySqlClient.MySqlParameter("TIPOD", TipoDocumento);
                parametros[2] = new MySql.Data.MySqlClient.MySqlParameter("TIPOA", TipoArchivo);
                parametros[3] = new MySql.Data.MySqlClient.MySqlParameter("N", NombreArchivo);
                parametros[4] = new MySql.Data.MySqlClient.MySqlParameter("TAMA", TamanoArchivo);
                parametros[5] = new MySql.Data.MySqlClient.MySqlParameter("T", Tipo);
                if (Tipo == 5)
                {                    
                    parametros[6] = new MySql.Data.MySqlClient.MySqlParameter("IDS", idSupervision);
                }
                else
                    parametros[6] = new MySql.Data.MySqlClient.MySqlParameter("IDS", 0);

                objhm.EjecutarStoreProcedure("Insertar_Proyecto_Documento", parametros);

            }
            catch (Exception)
            {

                throw;
            }
        }

        private void Child_Update(object parent)
        {
            // TODO: update values
        }

        private void Child_DeleteSelf(object parent)
        {
            HelperMySql objhm = HelperMySql.ObtenerConexion("");
            MySql.Data.MySqlClient.MySqlParameter[] parametros = new MySql.Data.MySqlClient.MySqlParameter[1];
            try
            {
                parametros[0] = new MySql.Data.MySqlClient.MySqlParameter("IDD", Id);

                objhm.EjecutarStoreProcedure("Eliminar_Proyecto_Documento", parametros);

            }
            catch (Exception)
            {

                throw;
            }
        }

        #endregion
    }
}
